#ifndef __WHIMSY_PROPERTY_NET_BASE_HPP__SHANHAOBO_19800429__
#define __WHIMSY_PROPERTY_NET_BASE_HPP__SHANHAOBO_19800429__

#include "./WhimsyProperty.hpp"
#include "./WhimsyArchive.hpp"

namespace Whms
{
    namespace Property
    {
        namespace Net
        {
            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////////

            namespace Base
            {
                template<class BaseT>
                struct Type : public BaseT
                {
                    typedef BaseT                   tSuper;
                    typedef typename tSuper::tData  tData;

                    Type(tData& inDataRef) : tSuper(inDataRef)
                    {

                    }

                    virtual ::Whms::Size::Type Serialize(::Whms::Archive::Ref)      = WIZ_NULLPTR;
                    virtual ::Whms::Size::Type Deserialize(::Whms::Archive::Ref)    = WIZ_NULLPTR;

                    virtual ::Whms::Bool::Type IsDirty() const                      = WIZ_NULLPTR;

                    virtual ::Whms::Void::Type MarkDirtyManual()                    = WIZ_NULLPTR;

                    virtual ::Whms::Void::Type ClearDirty()                         = WIZ_NULLPTR;
                }; /// struct Type

                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////

                namespace Int8
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::Int8::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::Int8::Type> tSuper;
                        typedef tSuper::tData                                                   tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::Int8::Type);
                } /// end of namespace Int8

                namespace Int16
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::Int16::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::Int16::Type>    tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::Int16::Type);
                } /// end of namespace Int16

                namespace Int32
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::Int32::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::Int32::Type>    tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::Int32::Type);
                } /// end of namespace Int32

                namespace Int64
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::Int64::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::Int64::Type>    tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::Int64::Type);
                } /// end of namespace Int64

                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////

                namespace UInt8
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::UInt8::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::UInt8::Type>    tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::UInt8::Type);
                } /// end of namespace UInt8

                namespace UInt16
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::UInt16::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::UInt16::Type>   tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::UInt16::Type);
                } /// end of namespace UInt16

                namespace UInt32
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::UInt32::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::UInt32::Type>   tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::UInt32::Type);
                } /// end of namespace UInt32

                namespace UInt64
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::UInt64::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::UInt64::Type>   tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::UInt64::Type);
                } /// end of namespace UInt64

                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////

                namespace Real32
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::Real32::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::Real32::Type>   tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::Real32::Type);
                } /// end of namespace Real32

                namespace Real64
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::Real64::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::Real64::Type>   tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::Real64::Type);
                } /// end of namespace Real64

                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////

                namespace Vec2
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::Vec2::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::Vec2::Type>     tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::Vec2::Type);
                } /// end of namespace Vec2

                namespace Vec3
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::Vec3::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::Vec3::Type>     tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::Vec3::Type);
                } /// end of namespace Vec3

                namespace Vec4
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::Vec4::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::Vec4::Type>     tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::Vec4::Type);
                } /// end of namespace Vec4

                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////

                namespace IntVec2
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::IntVec2::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::IntVec2::Type>  tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::IntVec2::Type);
                } /// end of namespace IntVec2

                namespace IntVec3
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::IntVec3::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::IntVec3::Type>  tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::IntVec3::Type);
                } /// end of namespace IntVec3

                namespace IntVec4
                {
                    struct Type : public ::Whms::Property::Net::Base::Type<::Whms::Property::IntVec4::Type>
                    {
                        typedef ::Whms::Property::Net::Base::Type<::Whms::Property::IntVec4::Type>  tSuper;
                        typedef tSuper::tData                                                       tData;

                        Type(tData& inDataRef);
                    };

                    WIZ_DECLARE(::Whms::Property::Net::Base::IntVec4::Type);
                } /// end of namespace IntVec4

                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////

            } /// end of namespace Base
        } /// end of namespace Net
    } /// end of namespace Property
} /// end of namespace Whms

#endif /*__WHIMSY_PROPERTY_NET_BASE_HPP__SHANHAOBO_19800429__*/
